import java.util.Arrays;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: Lenovo
 * Date: 2025-06-17
 * Time: 22:00
 */
public class MyArrayList {
        public int[] Array;            //数组
        public int Size=0;             //数组中元素个数，默认为0
        public int Max_Size=0;         //数组大小
        private static final int DEFAULT_SIZE = 10;       //初始化数组大小

        public MyArrayList() {                        //构造，初始化数组
            this.Array = new int[DEFAULT_SIZE];
            this.Max_Size=MyArrayList.DEFAULT_SIZE;
        }

        public void display() {                      //打印数组
            for (int i = 0; i <this.Size; i++) {
                System.out.print(this.Array[i]+" ");
            }
            System.out.println("");
        }

        public void add(int data) {        // 新增元素,默认在数组最后新增
            if(this.isFull()){
                this.Array= Arrays.copyOf(this.Array,2*this.Max_Size);
                this.Max_Size*=2;
            }
            this.Array[this.Size]=data;
            this.Size++;
        }

        public boolean isFull() {               //判断数组有没有满
            return this.Size==this.Max_Size;
        }

        private boolean checkPosInAdd(int pos) {      //判断pos位置是否合法
            if(pos<0||pos>=this.Size)
                return false;
            return true;//合法
        }

        public void add(int pos, int data) {          //在 pos 位置新增元素
            if(this.checkPosInAdd(pos)||pos==this.Size){
                for (int i =this.Size; i>pos; i--) {
                    this.Array[i]=this.Array[i-1];
                }
                this.Array[pos]=data;
                this.Size++;
            }
            else{
                System.out.println("位置错误，插入元素失败");
            }
        }

        // 判定是否包含某个元素
        public boolean contains(int data) {
            for (int i = 0; i < this.Size; i++) {
                if(this.Array[this.Size]==data)
                    return true;
            }
            return false;
        }

        // 查找某个元素对应的位置
        public int indexOf(int data) {
            for (int i = 0; i < this.Size; i++) {
                if(this.Array[this.Size]==data)
                    return i;
            }
            return -1;
        }

        // 获取 pos 位置的元素
        public int get(int pos) {
            if(this.isEmpty()){
                System.out.println("该数组为空，获取元素失败");
                throw new RuntimeException("该数组为空，获取元素失败");
            }
            if(this.checkPosInAdd(pos))
                return this.Array[pos];
            else {
                System.out.println("位置错误，获取元素失败");
                throw new RuntimeException("位置错误，获取元素失败");
            }
        }

        private boolean isEmpty() {
            return this.Size==0;
        }

        // 给 pos 位置的元素设为【更新为】 value
        public void set(int pos, int value) {
            if(this.checkPosInAdd(pos)){
                this.Array[pos]=value;
            }
            else{
                System.out.println("位置错误，修改元素失败");
                throw new RuntimeException("位置错误，修改元素失败");
            }

        }

        public void remove(int key) {         //删除第一个key元素
            for (int i = 0; i < this.Size; i++) {
                if(this.Array[i]==key) {
                    for (int j = i; j < this.Size - 1; j++)
                        this.Array[j]=this.Array[j+1];
                    this.Size--;
                    return ;
                }
            }
        }

        public int size() {                    //获取数组有效长度
            return this.Size;
        }

        public void clear() {                   // 清空顺序表
            this.Size=0;
        }
}
